<?php
/**
 * post,get和cmd输入容器
 *
 * @version $Id: in.php 323 2008-05-14 05:49:20Z iwind $
 * @package util.core
 */
class in extends IObject {
	/**
	 * Enter description here...
	 *
	 * @since 0.2.1
	 */
	const MOD_INT = 1;
	
	/**
	 * Enter description here...
	 *
	 * @since 0.2.1
	 */
	const MOD_LTRIM = 2;
	
	/**
	 * Enter description here...
	 *
	 * @since 0.2.1
	 */
	const MOD_RTRIM = 4;
	
	/**
	 * Enter description here...
	 *
	 * @since 0.2.1
	 */
	const MOD_TRIM = 8;
	
	/**
	 * Enter description here...
	 *
	 * @var in
	 * @since 0.1
	 */
	 private static $instance;
	 
	 /**
	  * Enter description here...
	  *
	  * @var array
	  * @since 0.1
	  */
	 private $params = array();
	 
	 
	 /**
	  * 构造器
	  *
	  * @since 0.2.1
	  */
	 private function __construct() {

	 }
	 
	 /**
	  * 取得in的单例
	  *
	  * @return in
	  * @since 0.1
	  */
	 public static function getInstance() {
	 	if (self::$instance == null) {
	 		self::$instance = new in();
	 	}
	 	
	 	return self::$instance;
	 }
	 
	 /**
	  * 分析@符号
	  * 
	  * 当为true时，参数中的@参数将会被解析，支持：
	  * - param@int 整形
	  * - param@trim 
	  * - param@rtrim
	  * - param@ltrim
	  * 
	  * 只对post和get的数据有效
	  *
	  * @since 0.2.1
	  */
	 public function parseAt() {
 		foreach ($_POST as $param=>$value) {
 			$this->parseAtParam($param, $value);
 			$_POST[$param] = $value;
 		}
 		foreach ($_GET as $param=>$value) {
 			$this->parseAtParam($param, $value);
 			$_GET[$param] = $value;
 		}
	 }
	 
	 /**
	  * 分析带@的参数
	  *
	  * @param unknown_type $param
	  * @param unknown_type $value
	  * @since 0.2.1
	  */
	 private function parseAtParam(&$param, &$value) {
	 	$array = explode("@", $param, 2);
	 	if (count($array) == 2) {
	 		$param = $array[0];
	 		switch ($array[1]) {
	 			case "int":
	 				$value = $this->modify($value, self::MOD_INT);
	 				break;
	 			case "trim":
	 				$value = $this->modify($value, self::MOD_TRIM);
	 				break;
	 			case "rtrim":
	 				$value = $this->modify($value, self::MOD_RTRIM);
	 				break;
	 			case "ltrim":
	 				$value = $this->modify($value, self::MOD_LTRIM);
	 				break;
	 		}
	 	}
	 }
	
	/**
	 * 判断属性是否已定义
	 *
	 * 在当前类中恒返回true
	 * 
	 * @param string $varname 属性名
	 * @return boolean
	 * @since 0.0.2
	 */
	public function __isset($varname) {
		return true;
	}
	
	/**
	 * 魔术方法
	 * 
	 * 根据对象被访问的变量名，返回变量值
	 *
	 * @param string $varname 变量名
	 * @return string
	 */
	public function __get($varname) {
		if (array_key_exists($varname, $this->params)) {
			return $this->params[$varname];
		}
		if (IRequest::post($varname) !== null) {
			return IRequest::post($varname); 
		}
		if (IRequest::get($varname) !== null) {
			return IRequest::get($varname); 
		}
		$cmdOptions = IServer::getCmdOptions();
		if (isset($cmdOptions["-" . $varname])) {
			return $cmdOptions["-" . $varname];
		}
		return null;
	}
	
	/**
	 * 设置参数
	 *
	 * @param mixed $name 名称
	 * @param mixed $value 值
	 * @since 0.1
	 */
	public function __set($name, $value) {
		$this->params[$name] = $value;
	}
	
	/**
	 * 设置参数
	 *
	 * @param mixed $name 名称
	 * @param mixed $value 值
	 * @since 0.1
	 */	
	public function set($name, $value) {
		$this->__set($name, $value);
	}
	
	/**
	 * 取得输入的参数值
	 * 
	 * 从0.2.1起可以使用modifier参数对参数值进行过滤：
	 *
	 * 比如一个URL为 /index?a=111&b=2222aaa
	 * <code>
	 * echo r("a"); // => 111
	 * r(array("a", "b")); // => array("a=>"111", "b"=>"2222aaa")
	 * echo r("b", in::MOD_INT); // => 2222
	 * </code>
	 *
	 * @param string|array $params 参数名
	 * @param integer $modifier 修饰，可以是多个修饰的组合，比如 in::MOD_INT|in::MOD_TRIM
	 * @return mixed 从0.2.1起，如果$params是一个字符串，则返回一个字符串或数字；如果$params是数组，则返回一个数组
	 * @since 0.0.3
	 */
	public function get($params, $modifier = null) {
		if (is_array($params)) {
			$result = array();
			foreach ($params as $param) {
				$result[$param] = $this->get($param, $modifier);
			}
			return $result;
		}
		else {
			$param = $params;
			$value = $this->__get($param);
			$value = $this->modify($value, $modifier);
			return $value;
		}
	}
	
	/**
	 * 根据修饰修改一个值
	 *
	 * @param string|array $value 值
	 * @param integer $modifier 修饰
	 * @since 0.2.1
	 */
	private function modify($value, $modifier) {
		if (is_array($value)) {
			$result = array();
			foreach ($value as $_key=>$_value) {
				$result[$_key] = $this->modify($_value, $modifier);
			}
			return $result;
		}
		else {
			if ($modifier & self::MOD_TRIM) {
				$value = trim($value);
			}
			if ($modifier & self::MOD_LTRIM) {
				$value = ltrim($value);
			}
			if ($modifier & self::MOD_RTRIM) {
				$value = rtrim($value);
			}
			if ($modifier & self::MOD_INT) {
				$value = intval($value);
			}
			return $value;
		}
	}
	
	/**
	 * 取得整型的参数
	 *
	 * @param integer|array $params 参数
	 * @return integer|array
	 * @since 0.2.1
	 */
	public function getInt($params) {
		return $this->get($params, self::MOD_TRIM|self::MOD_INT);
	}
	
	/**
	 * 取得字符串
	 *
	 * @param string|array $params 值
	 * @param integer $modifier 修饰
	 * @return string|array
	 * @since 0.2.1
	 */
	public function getStr($params, $modifier = self::MOD_TRIM) {
		return $this->get($params, $modifier);
	}
	
	/**
	 * 判断当前请发方法是否为POST
	 *
	 * 是返回true,否返回false
	 * 
	 * @return boolean
	 */
	public function isPost() {
		if (IRequest::getMethod() == "POST") {
			return true;
		}
		return false;
	}
	
	/**
	 * 判断当前请发方法是否为GET
	 *
	 * 是返回true,否返回false
	 * 
	 * @return boolean
	 */	
	public function isGet() {
		if (IRequest::getMethod() == "GET") {
			return true;
		}
		return false;
	}
	
	/**
	 * 取得POST输入参数
	 *
	 * @return array
	 * @since 0.0.3
	 */	
	public function getPosts() {
		return IRequest::strip($_POST);
	}
	
	/**
	 * 取得GET输入参数
	 *
	 * @return array
	 * @since 0.0.3
	 */	
	public function getGets() {
		return IRequest::strip($_GET);
	}
	
	/**
	 * 取得所有COOKIE值
	 *
	 * @return array
	 * @since 0.0.3
	 */	
	public function getCookies() {
		return IRequest::strip($_COOKIE);
	}
	
	/**
	 * 取得命令行输入参数
	 * 
	 * 注意不同于getArgv，该方法只能截取
	 * <pre>
	 *  xxx.php -- -a=1 -b=2
	 * </pre> 
	 * 中的-a和-b值
	 *
	 * @return array
	 * @since 0.0.3
	 */	
	public function getOpts() {
		return IServer::getCmdOptions();
	}
	
	/**
	 * 取得所有命令行输入参数
	 *
	 * @return array
	 * @since 0.0.3
	 */	
	public function getArgv() {
		return $_SERVER["argv"];
	}
	
	/**
	 * 取得所有POST,GET,COOKIE输入的参数
	 *
	 * @param boolean $includeCookie 是否包括cookie
	 * @return array
	 * @since 0.0.3
	 */	
	public function getRequests($includeCookie = false) {
		if ($includeCookie) {
			$request = IRequest::strip($_REQUEST);
		}
		else {
			$request = array_merge($this->getPosts(), $this->getGets());
		}
		return $request;
	}
	
	/**
	 * 取得所有的输入参数
	 *
	 * @return array
	 * @since 0.0.3
	 */
	public function getAll() {
		return array_merge($this->getRequests(true), $this->getOpts());
	}
}

?>